package com.javase.base.syntax;

/**
 * @author zq
 * @Date: 2020/5/27
 * 学习数组
 * 数组的四个特点：
 * 1.数组的长度是固定的。
 * 2.数组的元素必须是同一类型的，
 * 3.数据的元素可以是任意类型，包括基本类型和应用类型。
 * 4.数据属于引用对象，数据也可以看作对象，数据中的每个元素相当于该对象的成员。
 * 数据本身就是对象，java中的对象都是在堆中的，因此数据无论是原始类型还是应用类型，数组对象本身是在堆中的。
 */
public class ArrayDemo {
    public static void main(String[] args) {

        //定义一个静态数组
        int[] nums = {1, 2, 3, 4, 5, 6};
        System.out.println(nums[0]);

        //定义一个动态数组
        int[] arrs = new int[10];
        arrs[0] = 10; //给动态数据组赋值
        System.out.println(arrs[1]); //注意：动态数据初始化以后，动态数组的每个元素都是有默认值的.

        System.out.println("=================数据反转======================");
        ArrayDemo.reverse(nums);


        System.out.println("=================数据反转======================");

        ArrayDemo.test();


    }

    /**
     * 数据的反转
     *
     * @param arrays
     */
    public static void reverse(int[] arrays) {
        //定义一个接受反转元素的数组
        int[] reuslt = new int[arrays.length];

        for (int i = 0, j = reuslt.length - 1; i < arrays.length; j--, i++) {
            reuslt[j] = arrays[i];
        }

        for (int i : reuslt) {
            System.out.println(i);
        }
    }


    /**
     * 堆中的数组对象被栈中的a2引用.
     * 由于a1和a2是相同数组的别名，因此通过对a2所做的修改在a1中也可以看到。
     */

    public static void test() {
        //定义一个数据
        int[] a1 = {1, 2, 3, 4, 5, 6};
        //定义一个数组引用
        int[] a2;
        //java中可以将一个数组赋值给另外一个数组，其实真正做到的是只复制了一个引用。
        a2 = a1;

        for (int i = 0; i < a2.length; i++) {
            a2[i] = a2[i] + 1;
        }

        for (int i = 0; i < a1.length; i++) {
            System.out.println(a1[i]);
        }

    }
}
